#ifndef SRC_LTBASE_H_
#define SRC_LTBASE_H_

#include <inttypes.h>
#include <stdint.h>

typedef intptr_t lt_ISize;
typedef uintptr_t lt_USize;

#define lt_FmtUSize PRIuPTR
#define lt_FmtISize PRIiPTR

typedef int64_t lt_I64;
typedef uint64_t lt_U64;
typedef int32_t lt_I32;
typedef uint32_t lt_U32;
typedef int16_t lt_I16;
typedef uint16_t lt_U16;
typedef int8_t lt_I8;
typedef uint8_t lt_U8;

#define lt_FmtU64 PRIu64
#define lt_FmtI64 PRIi64

#define lt_FmtU32 PRIu32
#define lt_FmtI32 PRIi32

#define lt_FmtU16 PRIu16
#define lt_FmtI16 PRIi16

#define lt_FmtU8 PRIu8
#define lt_FmtI8 PRIi8

/**标记函数强制为内联。*/
#if ((defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__))
#define lt_ForceInline __attribute__((always_inline)) static inline
#else
#define lt_ForceInline static inline
#endif

/**标记函数不返回。*/
#if ((defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__))
#define lt_NoReturn __attribute__((noreturn))
#else
#define lt_NoReturn
#endif

/**在namespace名字空间中的Name类型导入当前环境。

这翻译为一个typedef语句。注意不要在头文件中使用它。*/
#define lt_UsingType(M_namespace, M_Name) typedef M_namespace##_##M_Name M_Name

#endif
